{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Пару слов о модели\n",
    "Поискав статьи и прошерстив тырнет, пришел к выводу, что рекурентные модели мало чем помогут нам, пушто нам нужно искать фичи и классифицировать по данным, а это и есть работа сверточных сетей. Рекурентные подойдут для предсказания ряда, условно дальнейшее поведение сигнала\n",
    "\n",
    "Более подробно [тут](https://yourtodo.life/ru/posts/rekurrentnyie-i-odnomernyie-svertochnyie-nejronnyie-seti/#:~:text=%D0%B8%D0%B3%D1%80%D0%B0%D0%B5%D1%82%20%D0%B2%D0%B0%D0%B6%D0%BD%D1%83%D1%8E%20%D1%80%D0%BE%D0%BB%D1%8C.-,%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Conv1D,-%D0%9F%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0) и [здесь](https://ya.zerocoder.ru/pgt-nejronnye-seti-na-python-rekurrentnye-i-odnomernye-svertochnye-nejronnye-seti/)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Чем кодить?\n",
    "Понятно что на питоне)\n",
    "### А че там по библиотекам?\n",
    "Библиотеки основые две:\n",
    "- Уже известный нам путорч\n",
    "- И keras :O\n",
    "\n",
    "keras более простой, более интуитивно понятный и сетки на нем менее масштабные\n",
    "\n",
    "pytocrh дает возможность создавать более сложные сетки и дает больше контроля над обучением"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Примеры построения сеток на keras [тык](https://pythonhint.com/post/1139737045160816/how-to-build-1d-convolutional-neural-network-in-keras-python) и [тык](https://under-sky-ai.ru/post/perevod_obrabotka_dannyih_vremennyih_ryadov_s_pomoschyu_odnomernyih_svertochnyih_neyronnyih_setey_v_keras)\n",
    "\n",
    "### Основные слои для nn на keras:\n",
    "- [Reshape](https://keras.io/api/layers/reshaping_layers/reshape/) - преобразование данных под нужный размер\n",
    "- [Conv1D](https://keras.io/api/layers/convolution_layers/convolution1d/) - слой свертки для выявления признаков\n",
    "- [MaxPooling1D](https://keras.io/api/layers/pooling_layers/max_pooling1d/) - слой пуллинга для max значений, польза от него в том, что уменьшаем размер данных и оставляем признаки\n",
    "- [GlobalAveragePooling1D](https://keras.io/api/layers/pooling_layers/global_average_pooling1d/) - слой пуллинга, выбирающий среднее значение среди всех данных\n",
    "- [Dropout](https://keras.io/api/layers/regularization_layers/dropout/) - \"Основная идея заключается в том, чтобы временно \"отключать\" случайные нейроны во время обучения, чтобы сеть не полагалась слишком сильно на конкретные нейроны и обобщала данные лучше.\"\n",
    "- [Dence](https://keras.io/api/layers/core_layers/dense/) - это то же самое, что fc, буквально dence = fc layer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import keras\n",
    "from keras import layers\n",
    "\n",
    "data = []\n",
    "\n",
    "model_m = keras.Sequential()\n",
    "model_m.add(layers.Reshape((data, data), input_shape=(data,)))\n",
    "model_m.add(layers.Conv1D(100, 10, activation='relu', input_shape=(data, data)))\n",
    "model_m.add(layers.Conv1D(100, 10, activation='relu'))\n",
    "model_m.add(layers.MaxPooling1D(3))\n",
    "model_m.add(layers.Conv1D(160, 10, activation='relu'))\n",
    "model_m.add(layers.Conv1D(160, 10, activation='relu'))\n",
    "model_m.add(layers.GlobalAveragePooling1D())\n",
    "model_m.add(layers.Dropout(0.5))\n",
    "model_m.add(layers.Dense(data, activation='softmax'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Про Conv1d на торче [ы](https://controlandlearning.wordpress.com/2020/07/26/pytorch-basics-1d-convolution/)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Про торч больше сказать нечего, добавляется только одна свертка, да и все)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "\n",
    "class Net1D(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(Net1D,self).__init__()\n",
    "\n",
    "        self.conv1 = nn.Conv1d(1, 8,kernel_size=3, stride=1)\n",
    "        self.bn1 = nn.BatchNorm1d(8)\n",
    "        self.relu = nn.ReLU()\n",
    "        self.maxpool = nn.MaxPool1d(kernel_size=3, stride=2)\n",
    "\n",
    "        self.conv2 = nn.Conv1d(8, 16,kernel_size=3, stride=1)\n",
    "        self.bn2 = nn.BatchNorm1d(16)\n",
    "        self.conv3 = nn.Conv1d(16,64,kernel_size=3, stride=1)\n",
    "        self.gap = nn.AdaptiveAvgPool1d(1)\n",
    "        self.fc = nn.Linear(64,2)\n",
    "\n",
    "\n",
    "    def forward(self,x):\n",
    "\n",
    "        x = self.conv1(x)\n",
    "        x = self.bn1(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.maxpool(x)\n",
    "\n",
    "        x = self.conv2(x)\n",
    "        x = self.bn2(x)\n",
    "        x = self.relu(x)\n",
    "        x = self.maxpool(x)\n",
    "\n",
    "        x = self.conv3(x)\n",
    "        x = self.gap(x)\n",
    "        x = x.view(x.size(0),-1)\n",
    "        x = self.fc(x)\n",
    " \n",
    "        return x"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
